import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;

// Create Class Calculator 
class Calculator extends JFrame { 
	/**
	 * @param H3Q
	 * @author CHUNG TOOC
	 * @deprecated Calculator
	 * @serial v1.0
	 */
	private static final long serialVersionUID = 1L;

	//Create Constants 
    private static final Font BIGGER_FONT = new Font("monspaced", Font.PLAIN, 20); 
     
    //Create fields 
    //... Component referenced during execution 
    private JTextField _displayField;       // display result / input. 
     
    //... Variables representing state of the calculator 
    private boolean   _startNumber = true;      // true: num key next 
    private String    _previousOp  = "=";       // previous operation 
    private CalculatorLogic _logic = new CalculatorLogic(); // The internal calculator. 
     
    //============================================================== method main 
    public static void main(String[] args) { 
        //... Set the Look and Feel to that of system we're running on. 
        try { 
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
        } catch (Exception unused) { 
            ; // Ignore exception because we can't do anything.  Will use default. 
        } 
         
        //... Create the window. 
        Calculator window = new Calculator(); 
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        window.setVisible(true); 
    } 
     
    //... Constructor 
    public Calculator() { 
        //... Set attributes of the display field 
        _displayField = new JTextField("0", 12); 
        _displayField.setHorizontalAlignment(JTextField.RIGHT); 
        _displayField.setFont(BIGGER_FONT); 
         
        //... Create and set attributes of clear button 
        JButton clearButton = new JButton("Clear"); 
        clearButton.setFont(BIGGER_FONT); 
        clearButton.addActionListener(new ClearListener()); 
         
        //... Use one listener for all numeric keys. 
        ActionListener numListener = new NumListener(); 
         
        //... Layout numeric keys in a grid.  Generate the buttons 
        //    in a loop from the chars in a string. 
        String buttonOrder = "789456123 0 "; 
        JPanel buttonPanel = new JPanel(); 
        buttonPanel.setLayout(new GridLayout(5, 3, 2, 2)); 
        for (int i = 0; i < buttonOrder.length(); i++) { 
            String keyTop = buttonOrder.substring(i, i+1); 
            JButton b = new JButton(keyTop); 
            if (keyTop.equals(" ")) { 
                //... Put a dummy button in this position. 
                b.setEnabled(false); 
            } else { 
                //... Put a digit button in the interface. 
                b.addActionListener(numListener); 
                b.setFont(BIGGER_FONT); 
            } 
            buttonPanel.add(b); 
        } 
         
        //... One ActionListener to use for all operator buttons. 
        ActionListener opListener = new OpListener(); 
         
        //... Create panel with gridlayout to hold operator buttons. 
        //    Use array of button names to create buttons in a loop. 
        JPanel opPanel = new JPanel(); 
        opPanel.setLayout(new GridLayout(5, 1, 2, 2)); 
        String[] opOrder = {"+", "-", "*", "/", "="}; 
        for (int i = 0; i < opOrder.length; i++) { 
            JButton b = new JButton(opOrder[i]); 
            b.addActionListener(opListener); 
            b.setFont(BIGGER_FONT); 
            opPanel.add(b); 
        } 
         
        //... Put Clear button in flow layout to keep from expanding. 
        JPanel clearPanel = new JPanel(); 
        clearPanel.setLayout(new FlowLayout()); 
        clearPanel.add(clearButton); 
         
        //... Layout the top-level content panel. 
        JPanel content = new JPanel(); 
        content.setLayout(new BorderLayout(5, 5)); 
        content.add(_displayField, BorderLayout.NORTH ); 
        content.add(buttonPanel   , BorderLayout.CENTER); 
        content.add(opPanel       , BorderLayout.EAST  ); 
        content.add(clearPanel    , BorderLayout.SOUTH ); 
         
        content.setBorder(BorderFactory.createEmptyBorder(10,10,10,10)); 
         
        //... Finish building the window (JFrame) 
        this.setContentPane(content); 
        this.pack(); 
        this.setTitle("H3Q Calculator v1.0"); 
        this.setResizable(false); 
        this.setLocationRelativeTo(null); 
    }//end constructor 
     
     
    // ActionClear 
    // Called by Clear btn action listener and elsewhere. 
    private void actionClear() { 
        _startNumber = true;         // Expecting number, not of. 
        _displayField.setText("0"); 
        _previousOp  = "="; 
        _logic.setTotal("0"); 
    } 
     
    // Inner listener class OpListener 
    /** Listener for all op buttons. */ 
    class OpListener implements ActionListener { 
        public void actionPerformed(ActionEvent e) { 
            // The calculator is always in one of two states. 
            // 1. A number must be entered -- an operator is wrong. 
            // 2. An operator must be entered. 
            if (_startNumber) { // Error: needed number, not operator 
                //... In this state we're expecting a number, but got an operator. 
                actionClear(); 
                _displayField.setText("ERROR - No operator"); 
            } else { 
                //... We're expecting an operator. 
                _startNumber = true;  // Next thing must be a number 
                try { 
                    // Get value from display field, convert, do prev op 
                    // If this is the first op, _previousOp will be =. 
                    String displayText = _displayField.getText(); 
                     
                    if (_previousOp.equals("=")) { 
                        _logic.setTotal(displayText); 
                    } else if (_previousOp.equals("+")) { 
                        _logic.add(displayText); 
                    } else if (_previousOp.equals("-")) { 
                        _logic.subtract(displayText); 
                    } else if (_previousOp.equals("*")) { 
                        _logic.multiply(displayText); 
                    } else if (_previousOp.equals("/")) { 
                        _logic.divide(displayText); 
                    } 
                     
                    _displayField.setText("" + _logic.getTotalString()); 
                     
                } catch (NumberFormatException ex) { 
                    actionClear(); 
                    _displayField.setText("Error"); 
                } 
                 
                //... set _previousOp for the next operator. 
                _previousOp = e.getActionCommand(); 
            }//endif _startNumber 
        }//endmethod 
    }//end class 
     
     
    //////////////////////////////////// inner listener class ClearListener 
    /** Action listener for numeric keys */ 
    class NumListener implements ActionListener { 
        public void actionPerformed(ActionEvent e) { 
            String digit = e.getActionCommand(); // Get text from button 
            if (_startNumber) { 
                //... This is the first digit, clear field and set 
                _displayField.setText(digit); 
                _startNumber = false; 
            } else { 
                //... Add this digit to the end of the display field 
                _displayField.setText(_displayField.getText() + digit); 
            } 
        } 
    } 
     
     
    //////////////////////////////////// inner listener class ClearListener 
    class ClearListener implements ActionListener { 
        public void actionPerformed(ActionEvent e) { 
            actionClear(); 
        } 
    } 
}  